#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>

// 用户信息结构体
struct UserInfo {
    int id;
    QString username;
    QString role;
    QString createdAt;
};

// 物品信息结构体
struct ItemInfo {
    int id;
    QString name;        // 物品名称
    QString model;       // 规格型号
    int quantity;        // 库存数量
    QString location;    // 存放位置
};

// 库存操作记录结构体
struct StockRecord {
    int id;
    int itemId;
    QString itemName;
    QString type;        // "入库" 或 "出库"
    int quantity;
    QString username;
    QString timestamp;
};

// 记录查询条件结构体
struct RecordFilter {
    QString startDate;      // 开始日期
    QString endDate;        // 结束日期
    int userId = -1;        // 用户ID（-1表示所有用户）
    int itemId = -1;        // 物品ID（-1表示所有物品）
    QString type;           // 操作类型（"入库"/"出库"，空表示所有）
};

// 库存统计数据结构体
struct InventoryStatistics {
    int totalItems;
    int totalQuantity;
    int lowStockItems;
    double averageQuantity;
    QList<QPair<QString, int>> topItems;    // 库存最多的物品
    QList<QPair<QString, int>> lowStockList; // 低库存物品详情
};

// 操作统计数据结构体
struct OperationStatistics {
    int totalOperations;
    int stockInCount;
    int stockOutCount;
    QList<QPair<QString, int>> userActivity;     // 用户活跃度
    QList<QPair<QString, int>> monthlyOperations; // 月度操作统计
    QList<QPair<QString, int>> itemActivity;     // 物品操作频率
};

// 趋势数据结构体
struct TrendData {
    QList<QPair<QString, int>> monthlyStockIn;   // 月度入库趋势
    QList<QPair<QString, int>> monthlyStockOut;  // 月度出库趋势
    QList<QPair<QString, int>> inventoryTrend;   // 库存变化趋势
};

class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    // 获取DatabaseManager单例实例
    static DatabaseManager& getInstance();
    // 初始化数据库（连接、创建表、插入默认用户）
    bool initializeDatabase();
    // 连接到数据库
    bool connectToDatabase();
    // 关闭数据库连接
    void closeDatabase();
    // 获取数据库对象
    QSqlDatabase getDatabase();
    
    // 用户操作方法
    // 验证用户登录
    bool validateUser(const QString& username, const QString& password, UserInfo& userInfo);
    // 注册新用户（固定为普通用户）
    bool registerUser(const QString& username, const QString& password);
    // 检查用户名是否已存在
    bool isUsernameExists(const QString& username);
    
    // 用户管理方法
    // 获取所有用户列表
    QList<UserInfo> getAllUsers();
    // 添加新用户（管理员可创建任意角色）
    bool addUser(const QString& username, const QString& password, const QString& role);
    // 更新用户信息
    bool updateUser(int userId, const QString& username, const QString& password, const QString& role);
    // 删除用户
    bool deleteUser(int userId);
    // 根据用户名搜索用户
    QList<UserInfo> searchUsers(const QString& searchText);
    
    // === 物品管理方法 ===
    // 获取所有物品列表
    QList<ItemInfo> getAllItems();
    // 添加新物品
    bool addItem(const QString& name, const QString& model, int quantity, const QString& location);
    // 更新物品信息
    bool updateItem(int itemId, const QString& name, const QString& model, int quantity, const QString& location);
    // 删除物品
    bool deleteItem(int itemId);
    // 根据名称或型号搜索物品
    QList<ItemInfo> searchItems(const QString& searchText);
    // 根据ID获取物品信息
    ItemInfo getItemById(int itemId);
    
    // === 库存操作方法 ===
    // 添加库存操作记录（入库/出库）
    bool addStockRecord(int itemId, const QString& type, int quantity, int userId);
    // 更新物品库存数量
    bool updateItemQuantity(int itemId, int quantityChange);
    // 检查库存是否充足（出库前检查）
    bool checkStockAvailable(int itemId, int requiredQuantity);
    // 获取库存操作记录
    QList<StockRecord> getStockRecords(int itemId = -1);
    // 获取库存统计信息
    QVariantMap getInventoryStatistics();
    
    // === 记录查询方法 ===
    // 根据筛选条件获取记录
    QList<StockRecord> getFilteredRecords(const RecordFilter& filter);
    // 获取指定用户的记录
    QList<StockRecord> getUserRecords(int userId);
    // 获取指定物品的记录
    QList<StockRecord> getItemRecords(int itemId);
    // 获取日期范围内的记录
    QList<StockRecord> getRecordsByDateRange(const QString& startDate, const QString& endDate);
    // 获取记录总数
    int getTotalRecordsCount();
    // 获取记录统计信息
    QVariantMap getRecordsStatistics();
    
    // === 统计报表方法 ===
    // 获取详细库存统计
    InventoryStatistics getDetailedInventoryStatistics();
    // 获取操作统计（指定时间范围）
    OperationStatistics getDetailedOperationStatistics(const QString& startDate = "", const QString& endDate = "");
    // 获取趋势数据（指定月份数）
    TrendData getTrendAnalysisData(int months = 12);
    // 获取物品价值统计
    QList<QPair<QString, double>> getItemValueStatistics();
    // 获取仪表板汇总数据
    QVariantMap getDashboardSummary();

private:
    // 构造函数
    explicit DatabaseManager(QObject *parent = nullptr);
    // 析构函数
    ~DatabaseManager();
    
    // 创建数据库表
    bool createTables();
    // 数据库迁移
    bool migrateDatabase();
    // 插入默认管理员用户
    bool insertDefaultAdmin();
    
    // 数据库连接对象
    QSqlDatabase m_database;
    // 单例实例指针
    static DatabaseManager* m_instance;
};

#endif // DATABASEMANAGER_H